home *** CD-ROM | disk | FTP | other *** search
- (* Compute the greatest common divisor (gcd) and the lowest common
- multiple (lcm) of two natural numbers by using addition and
- subtraction only. Note that gcd(m,n) * lcm(m,n) = m*n. Repeat
- reading pairs of integers until you encounter a 0. For each
- pair, print the arguments, the gcd and the lcm.
- Indicate the loop invariant.*)
-
- MODULE gcdlcm;
- FROM InOut IMPORT ReadCard, WriteLn, WriteString, WriteCard;
-
- VAR x,y,u,v: CARDINAL;
-
- BEGIN
- WriteString('x = '); ReadCard(x); WriteLn;
- WHILE x # 0 DO
- WriteString('y = '); ReadCard(y);
- u := x; v := y;
- WHILE x # y DO
- (*gcd(x,y) = gcd(x0,y0), x*v + y*u = 2*x0*y0*)
- IF x > y THEN
- x := x-y;
- u := u+v;
- ELSE
- y := y-x;
- v := v+u;
- END
- END;
- WriteCard(x,6); WriteCard((u+v) DIV 2,6); WriteLn;
- WriteString('x = '); ReadCard(x); WriteLn;
- END;
- END gcdlcm.
-